#pragma once

#include <Eigen/Dense>
#include <random>

namespace  ldl_eigen
{
class Iterator
{
public:
    explicit Iterator(int64_t data_size);

    Eigen::MatrixXf get_rand_batch(const Eigen::MatrixXf &data, int64_t batch);

    void get_rand_batch(const Eigen::MatrixXf &feature, const Eigen::MatrixXf &label, 
        Eigen::MatrixXf &feature_batch, Eigen::MatrixXf &label_batch, int64_t batch_size);

    void get_rand_batch(const std::vector<std::vector<double>> &feature, const std::vector<std::vector<double>> &label, 
    Eigen::MatrixXf &feature_batch, Eigen::MatrixXf &label_batch, int64_t batch_size);
private:
    void reset();
private:
    int64_t data_size_;          // 数据大小
    std::vector<int64_t> indices_; // 索引向量
    std::mt19937 rng_;           // 随机数生成器
    int64_t current_idx_;        // 当前索引位置
};
}
